// main.js（后端）    浏览器（客户端）  index.ejs（前端）   login.ejs（前端）


// npm i express    渲染        （用于展示动态页面）
// npm i ejs        模板响应文件        （nodejs中的ejs文件，相当于前端html页面    main.js文件是后端）
// npm i echarts    数据可视化图库       位置node_modules/echarts/dist/echarts.min.js
// npm i express-session    //  cookie会话存储
// npm i crypto-js          //  加解密


// require（模块名）      nodejs中导入模块

// express.static()   //  静态资源（创建public文件）


// path模块     用来处理和转换文件路径
// （拼接路径：将   路径片段    拼接成  完整路径）
// （解析路径：将   相对路径    解析为  绝对路径）
// path.dirname()   获取路径中的文件名
// path.join(__dirname, "views")当前目录下的绝对路径

// res.send('')     向浏览器（客户端）发送响应

// 获取前端动态数据，传入到后端 express 模板中
// res.render('index', {})      用于渲染模板文件    并将获取到的前端动态数据    传入给浏览器（客户端）


// res.render('index', data) 方法会把 data 对象中的数据填充到名为 index.ejs 的模板文件里，
// 生成最终的 HTML 页面并发送给客户端。
// ----------------------------------------------------------------------------------------------------------



console.log("主入口文件");






// 导入 express 模块
const express = require("express");
// 导入 path    路径模块
const path = require("path");
// 导入用户会话模块
const session = require("express-session");
const { PassThrough } = require("stream");

// 导入加解密模块
const Crypto = require('crypto-js');




// 创建 express 实例
const app = express();




// 设置ejs为引擎模板
app.set('view engine', 'ejs');
// 设置前端页面文件目录    path.join(__dirname, "views")当前目录下的绝对路径
app.set('views', path.join(__dirname, "../views"));     //  ../不能省略，不然找不到
// 配置静态资源目录
app.use(express.static(path.join(__dirname, "../public")));     //  ../不能省略，不然找不到


// 配置express-session中间件
app.use(session({
    secret: 'xhzmmsd',          // 用于签名 session ID 的字符串
    resave: false,            // 强制 session 保存即使没有变化
    saveUninitialized: false, // 强制保存未初始化的 session
    cookie: { secure: false } // 设置 cookie 的安全属性
}));


// 解析post请求体   对应网络login请求表头中的Content-Type: application/x-www-form-urlencoded; charset=UTF-8
app.use(express.urlencoded({ extended: true }))





// 定义路由，处理首页（/）的 GET 请求
app.get('/', (req, res) => {
    // 判断用户是否登录，不登陆不能进入首页（无法通过url进入首页）
    if (!req.session.user) {
        // 不登陆，重定向转到登录页面
        res.redirect("/login")
    }
    else {
        // 将请求来的动态数据   传入后端模板
        res.render('index.ejs', { name: '首页' });
    }
})




// 定义路由，处理登录（/login）的 GET 请求
app.get('/login', (req, res) => {
    // 将请求来的动态数据   传入后端模板
    res.render('login.ejs', { name: '登录' });
});



// 定义提交路由，登录时需要提交账号密码 
app.post('/login', (req, res) => {

    // // 设置cookie
    req.session.user = { "username": "qiku" }       //  每次登录都会带着cookie

    // 获取前端发送的数据
    let username = req.body.username;
    let password = req.body.password;
    if ((password == Crypto.MD5('123123').toString() || password == Crypto.MD5('123456').toString() || password == Crypto.MD5('123321').toString()) && (username == 'admin' || username == 'ckx' || username == 'xhz')) {
        res.json({
            code: 0,
            msg: "登录成功！"
        })
    }
    else {
        res.json({
            code: 2222,
            msg: "账号或密码错误！"
        })
    }
})




// 定义退出路由，点击退出清除用户cookit并跳转到登录页面 
app.get('/loginout', (req, res) => {
    // 设置cookie
    req.session.destroy()       //  清除用户cookie，下次登录需要重新输入账号密码
    // 重定向到首页
    res.redirect('/login')
})




// 定义登录路由，登录时需要提交账号密码 
app.get('/checkusername', (req, res) => {
    // 获取前端发送的数据
    let username = req.query.username
    if (username == "admin" || username == "cxk" || username == "xhz") {
        res.json({
            code: 0,
            msg: "账号正确！"
        });
    }
    else {
        res.json({
            code: 1111,
            msg: "账号错误或不存在！"
        });
    }
});







// 定义动态数据--注水量路由
app.get('/getWaterData', (req, res) => {
    // 从数据库或传感器获取数据
    let waterData = {
        inputData: Math.floor(Math.random() * 1000) + 1000,
        outputData: Math.floor(Math.random() * 1000) + 1000,
    }
    res.json({
        code: 0,
        data: waterData
    })
});






// 定义动态数据--污染路由
app.get('/getWuranData', (req, res) => {

    // 从数据库或传感器获取数据
	var salvProName =["企业总数","废气企业","废水企业","铅污染","铬污染"];
	var salvProValue =[Math.floor(Math.random() * 500),Math.floor(Math.random() * 500),Math.floor(Math.random() * 500),Math.floor(Math.random() * 500),Math.floor(Math.random() * 500)];
	var salvProMax =[];//背景按最大值
	for (let i = 0; i < salvProValue.length; i++) {
	    salvProMax.push(salvProValue)
	}
	let option = {

	    grid: {
	        left: '2%',
	        right: '2%',
	        bottom: '-6%',
	        top: '8%',
	        containLabel: true
	    },
	    tooltip: {
	        trigger: 'axis',
	        axisPointer: {
	            type: 'none'
	        },
	        formatter: function(params) {
	            return params[0].name  + ' : ' + params[0].value
	        }
	    },
	    xAxis: {
	        show: false,
	        type: 'value'
	    },
	    yAxis: [{
	        type: 'category',
	        inverse: true,
	        axisLabel: {
	            show: true,
	            textStyle: {
	                color: '#fff'
	            },
	        },
	        splitLine: {
	            show: false
	        },
	        axisTick: {
	            show: false
	        },
	        axisLine: {
	            show: false
	        },
	        data: salvProName
	    }, {
	        type: 'category',
	        inverse: true,
	        axisTick: 'none',
	        axisLine: 'none',
	        show: true,
	        axisLabel: {
	            textStyle: {
	                color: '#ffffff',
	                fontSize: '12'
	            },
	        },
	        data:salvProValue
	    }],
	    series: [{
	            name: '值',
	            type: 'bar',
	            zlevel: 1,
	            itemStyle: {
	                normal: {
	                    barBorderRadius: 30,
	                    // color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [{
	                    //     offset: 0,
	                    //     color: 'rgb(57,89,255,1)'
	                    // }, {
	                    //     offset: 1,
	                    //     color: 'rgb(46,200,207,1)'
	                    // }]),
	                },
	            },
	            barWidth: 10,
	            data: salvProValue
	        },
	        {
	            name: '背景',
	            type: 'bar',
	            barWidth: 10,
	            barGap: '-100%',
	            data: salvProMax,
	            itemStyle: {
	                normal: {
	                    color: 'rgba(24,31,68,1)',
	                    barBorderRadius: 30,
	                }
	            },
	        },
	    ]
	};



    res.json({
        code: 0,
        data: option
    })
});









// 启动服务器，监听指定端口
const port = 3000
app.listen(port, () => {
    console.log(`服务运行在 http://localhost:${port}`);
});













